
Lightning 作為一個部落格平台,最重要的自然是發文功能。本篇要先準備好文章功能需要的 Migration、Model、Presenter 等等。
為了快速產生需要的檔案,新增 Model 後面還帶上 -mfr,m 是順便新增 Migration,f 是新增 Factory,r 是新增 Resource Controller,一行指令就解決:
php artisan make:model Post -mfr
然後規劃我們的資料表,這裡是用 author_id 指向 users 資料表:
database/migrations/2020_09_16_090156_create_posts_table.php
Schema::create('posts', function (Blueprint $table) {
    $table->id();
    $table->string('title');
    $table->string('description');
    $table->text('content');
    $table->string('thumbnail')->nullable();
    $table->unsignedInteger('visits')->default(0);
    $table->boolean('published')->default(false);
    $table->foreignId('author_id')->constrained('users')->onDelete('cascade');
    $table->timestamps();
});
然後跑 Migrate:
php artisan migrate
這裡增加一些 Post 裡的設定,$fillable 是批量填充資料時允許的欄位;$casts 是型別轉換;updateDescription() 會自動更新 description,擷取文章內容的前80個字,並在新增和更新 Model 時擷取;還有關聯作者 User Model:
app/Post.php
use Illuminate\Support\Str;
protected $fillable = [
    'title', 'description', 'content', 'thumbnail', 'visits', 'published',
];
protected $casts = [
    'visits' => 'integer',
    'published' => 'boolean',
    'author_id' => 'integer',
];
protected static function booted()
{
    static::creating(function (self $post) {
        $post->updateDescription();
    });
    static::updating(function (self $post) {
        $post->updateDescription();
    });
}
public function updateDescription()
{
    $this->description = Str::limit(preg_replace('/\r|\n/', '', $this->content), 80);
    return $this;
}
public function author()
{
    return $this->belongsTo(User::class);
}
User 也要設定和 Post 的關聯,這裡也要設定對應的 key author_id:
app/User.php
public function posts()
{
    return $this->hasMany(Post::class, 'author_id');
}
Post 的假資料 Factory:
database/factories/PostFactory.php
$factory->define(Post::class, function (Faker $faker) {
    return [
        'title' => $faker->realText(10),
        'content' => $faker->realText(1000),
        'visits' => $faker->numberBetween(10, 1000),
        'published' => $faker->boolean(80),
    ];
});
和假資料 Seeder:
php artisan make:seeder PostSeeder
隨機指派文章作者:
database/seeds/PostSeeder.php
use App\Post;
use App\User;
public function run()
{
    factory(Post::class, 12)->make()->each(function (Post $post) {
        User::inRandomOrder()->first()->posts()->save($post);
    });
}
database/seeds/DatabaseSeeder.php
public function run()
{
    ...
    $this->call(PostSeeder::class);
}
Presenter 也先準備好:
php artisan make:presenter PostPresenter
app/Presenters/PostPresenter.php
public function values(): array
{
    return [
        'id' => $this->id,
        'title' => $this->title,
        'description' => $this->description,
        'thumbnail' => $this->thumbnail,
        'visits' => $this->visits,
        'created_at' => $this->created_at->format('Y-m-d H:i:s'),
        'created_ago' => $this->created_at->diffForHumans(),
        'published' => $this->published,
    ];
}
前置作業準備好,下一篇可以開始新增文章了!
Lightning 範例程式碼:https://github.com/ycs77/lightning